#ifndef SERVER_H
#define SERVER_H
#include <QObject>
#include <QHttpServer>
#include <QProtobufSerializer>
#include <QWebSocketServer>
#include <QFileInfo>
#include <QFile>
#include <QPixmap>
#include <QIcon>

#include "base.qpb.h"
#include "gateway.qpb.h"
#include "user.qpb.h"
#include "message.qpb.h"
#include "friend.qpb.h"
#include "transmite.qpb.h"
#include "file.qpb.h"
#include "notify.qpb.h"
#include "speech.qpb.h"

//////////////////////////////////////////////////////////////
/// 工具函数
/////////////////////////////////////////////////////////////
static inline QString getFileName(const QString& path)
{
    QFileInfo fileInfo(path);
    return fileInfo.fileName();
}
//封装宏作为打印日志的方式
#define TAG QString("[%1:%2]").arg(getFileName(__FILE__), QString::number(__LINE__))
#define LOG() qDebug() << TAG

static inline QString formatTime(int64_t timestamp)
{
    QDateTime dateTime = QDateTime::fromSecsSinceEpoch(timestamp);
    return dateTime.toString("MM-dd HH:mm:ss");
}
static inline int64_t getTime()
{
    return QDateTime::currentSecsSinceEpoch();
}
//将QByteArray转成 QIcon
static inline QIcon makeIcon(const QByteArray& byteArray)
{
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);
    QIcon icon(pixmap);
    return icon;
}
//读写文件操作
//从指定文件中 读取所有二进制内容 得到一个QByteArray
static inline QByteArray loadFileToByteArray(const QString& path)
{
    QFile file(path);
    bool ok = file.open(QFile::ReadOnly);
    if(!ok)
    {
        LOG() << "文件打开失败！path: " << path << " errmsg: " << file.errorString();
        return QByteArray();
    }
    QByteArray content = file.readAll();
    file.close();
    return content;
}
//把得到一个QByteArray 写道文件里
static inline void writeByteArrayToFile(const QString& path, const QByteArray& content)
{
    QFile file(path);
    bool ok = file.open(QFile::WriteOnly);
    if(!ok)
    {
        qDebug() << "文件打开失败！";
        return;
    }

    file.write(content);
    file.flush();
    file.close();
    return;
}
//////////////////////////////////////////////////////////////////
/// HTTP 服务器
//////////////////////////////////////////////////////////////////
class HttpServer : public QObject {
    Q_OBJECT

private:
    static HttpServer* instance;
    HttpServer() {}

    QHttpServer httpServer;
    QProtobufSerializer serializer;

public:
    static HttpServer* getInstance();

    // 通过这个函数, 针对 HTTP Server 进行初始化 (绑定端口, 配置路由....)
    bool init();
    // 获取个人用户信息
    QHttpServerResponse getUserInfo(const QHttpServerRequest &request);
    // 获取好友列表
    QHttpServerResponse getFriendList(const QHttpServerRequest &request);
    // 获取会话列表
    QHttpServerResponse getChatSessionList(const QHttpServerRequest &request);
    // 获取好友申请列表
    QHttpServerResponse getPendingFriendEventList(const QHttpServerRequest &request);
    // 获取最近消息列表
    QHttpServerResponse getRecentMessageList(const QHttpServerRequest &request);
    // 发送消息
    QHttpServerResponse newMessage(const QHttpServerRequest &request);
    // 修改用户昵称
    QHttpServerResponse setNickname(const QHttpServerRequest &request);
    // 修改用户签名
    QHttpServerResponse setDescription(const QHttpServerRequest &request);
    // 获取验证码
    QHttpServerResponse getVerifyCode(const QHttpServerRequest &request);
    // 修改手机号
    QHttpServerResponse setPhoneNumber(const QHttpServerRequest &request);
    // 修改头像
    QHttpServerResponse setAvatar(const QHttpServerRequest &request);
    // 删除好友
    QHttpServerResponse removeFriend(const QHttpServerRequest &request);
    // 添加好友
    QHttpServerResponse addFriend(const QHttpServerRequest &request);
    // 同意好友申请
    QHttpServerResponse acceptFriendApply(const QHttpServerRequest &request);
    // 创建群聊
    QHttpServerResponse createGroupChatSession(const QHttpServerRequest &request);
    // 获取群聊成员列表
    QHttpServerResponse getGroupChatMemberList(const QHttpServerRequest &request);
    // 搜索用户
    QHttpServerResponse searchUser(const QHttpServerRequest &request);
    // 搜索历史消息
    QHttpServerResponse searchHistoryMessage(const QHttpServerRequest &request);
    // 按时间搜索历史消息
    QHttpServerResponse searchHistoryMessageByTime(const QHttpServerRequest &request);
    // 用户登录
    QHttpServerResponse userLogin(const QHttpServerRequest &request);
    // 用户注册
    QHttpServerResponse userRegister(const QHttpServerRequest &request);
    // 用户手机号登录
    QHttpServerResponse phoneLogin(const QHttpServerRequest &request);
    // 用户手机号注册
    QHttpServerResponse phoneRegister(const QHttpServerRequest &request);
    // 获取单个文件
    QHttpServerResponse getSingleFile(const QHttpServerRequest &request);
    // 语音转文字
    QHttpServerResponse speechToText(const QHttpServerRequest &request);
};


//////////////////////////////////////////////////////////////////
/// Websocket 服务器
//////////////////////////////////////////////////////////////////
class WebSocketServer : public QObject
{
    Q_OBJECT
public:
    //单列
    static WebSocketServer* getInstance();
    //针对websocket服务器进行初始化操作
    bool init();

private:

    static WebSocketServer* instance;

    WebSocketServer()
        :websocketServer("websocket server", QWebSocketServer::NonSecureMode, nullptr)
    {}

    QWebSocketServer websocketServer;

    //消息索引
    int messageIndex = 0;
    //序列化器
    QProtobufSerializer serializer;
    //测试删除id
    int removedFriendUserId = 3;
    //测试添加好友申请id
    int addFriendApplyUserId = 0;
    //测试好友申请处理结果id
    int friendApplyProcessUserId = 0;
    //测试创建群聊id
    int createGroupChatSessionId = 0;
signals:
    //文本消息信号
    void sendTextResp();
    //删除好友信号
    void sendFriendRemove();
    //添加好友申请信号
    void sendAddFriendApply();
    //推送好友申请结果信号
    void sendFriendApplyProcess(bool isAccepted);
    //创建群聊信号
    void sendCreateGroupChatSession();
    //图片消息信号
    void sendImageResp();
    //文件消息信号
    void sendFileResp();
    //语音消息信号
    void sendSpeechResp();

};

#endif // SERVER_H
